let nOrs: number | string = '1223'; // 联合类型
/*
 - 直接执行这段代码，ts会报错，nOrs是联合类型，只能应用number和string共有的属性和方法
   正确: console.log(nOrs.toString()); console.log(nOrs.valueOf());
   错误: console.log(nOrs.length);
*/

function getLength(input: number | string): number {
  /*
    需求场景:
      1. input是参数，我们要得到参数的长度
      2. 但input也有可能是数值型，我们直接调用input.length，ts会报错
      3. ts中的类型断言，解决了这一问题
      4. 类型断言不是类型转换，只是告诉ts先把他当作指定的类型来执行
  */
  const str = input as string;
  if(str.length) {
    return str.length;
  }else {
    const num = input as number;
    return num.toString().length;
  }
}

// type guard 类型守护：相比于类型断言更优解决联合类型的问题
function getLengths(input: number | string) {
  if(typeof(input) == 'string') {
    return str.length;
  }else {
    return input.toString().length;
  }
}

